home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Personal Computer World 2009 February
/
PCWFEB09.iso
/
Software
/
Linux
/
Kubuntu 8.10
/
kubuntu-8.10-desktop-i386.iso
/
casper
/
filesystem.squashfs
/
usr
/
sbin
/
foomatic-nonumericalids
< prev
next >
Wrap
Text File
|
2008-08-19
|
4KB
|
154 lines
#!/usr/bin/perl
# This is foomatic-nonumericalids, it renames all printer entries with a
# numerical ID and generates a translation table.
use Foomatic::Defaults;
use Foomatic::DB qw/get_overview/;
# Needs "get_overview" to be added to the "@EXPORT_OK" list of DB.pm!
# Read out the program name with which we were called, but discard the path
$0 =~ m!/([^/]+)\s*$!;
$progname = $1;
my $db = new Foomatic::DB;
# Get the printer overview list as a Perl data structure
$db->get_overview();
# Find all numerical IDs, determine new clear-text IDs, and rename the
# printer entry files.
my @oldidlist;
my @newidlist;
my @translationtable;
my %idhash;
my $printer;
for $printer (@{$db->{'overview'}}) {
# Nothing to do if ID is not numerical
next if $printer->{'id'} !~ /^\d/;
# Generate new ID from make and model name
$newid = join('-',($printer->{'make'},
$printer->{'model'}));
$newid =~ s![ /,\(\)\?]!_!g;
$newid =~ s![\+]!plus!g;
$newid =~ s![\&]!_and_!g;
$newid =~ s!__+!_!g;
$newid =~ s!_$!!;
$newid =~ s!_-!-!;
$newid =~ s!^_!!;
# Append a number in case of duplicate IDs
if (member($newid, @newidlist)) {
print "WARNING: ID \"$newid\" already exists, ";
$newid .= '_';
my $i = 1;
while (member("$newid$i", @newidlist)) {
$i ++;
}
$newid .= $i;
print "using \"$newid\",\n";
}
print "$printer->{'make'} $printer->{'model'}: $printer->{'id'} -> $newid\n";
# Add change to lists
push (@oldidlist, "db/source/printer/$printer->{'id'}.xml\n");
push (@newidlist, "db/source/printer/$newid.xml\n");
push (@translationtable, "$printer->{'id'} $newid\n");
$idhash{$printer->{'id'}} = $newid;
# Rename the printer entry file
system("mv $libdir/db/source/printer/$printer->{'id'}.xml $libdir/db/source/printer/$newid.xml") and
die "Could not rename $printer->{'id'}.xml to $newid.xml.\n";
print " Renamed $printer->{'id'}.xml to $newid.xml.\n";
}
# Translation table to convert old numerical printer IDs to new
# clear-text ones
my $file = "$libdir/db/oldprinterids";
open FILE, "> $file" ||
die "File $file cannot be written!\n";
print FILE join('', @translationtable);
close FILE;
print " Wrote $file.\n";
# List of old printer files to be removed from CVS
$file = "oldprinterfiles";
open FILE, "> $file" ||
die "File $file cannot be written!\n";
print FILE join('', @oldidlist);
close FILE;
print " Wrote $file.\n";
# List of files to be added to the CVS
$file = "newprinterfiles";
open FILE, "> $file" ||
die "File $file cannot be written!\n";
print FILE join('', @newidlist);
close FILE;
print " Wrote $file.\n";
# Scan through all files of the database and replace all references to
# numerical printer IDs to the appriopriate new IDs
my @xmlfiles;
opendir DIR, "$libdir/db/source/printer" ||
die "Cannot open printer XML directory!\n";
while ($file = readdir(DIR)) {
push(@xmlfiles, "printer/$file") if $file =~ /^[^\.].*\.xml$/;
}
closedir DIR;
opendir DIR, "$libdir/db/source/driver" ||
die "Cannot open driver XML directory!\n";
while ($file = readdir(DIR)) {
push(@xmlfiles, "driver/$file") if $file =~ /^[^\.].*\.xml$/;
}
closedir DIR;
opendir DIR, "$libdir/db/source/opt" ||
die "Cannot open option XML directory!\n";
while ($file = readdir(DIR)) {
push(@xmlfiles, "opt/$file") if $file =~ /^[^\.].*\.xml$/;
}
closedir DIR;
my $changes = 0;
my $chfiles = 0;
my @chfilelist;
for $file (@xmlfiles) {
print "Processing $file";
open FILE, "< $libdir/db/source/$file" ||
die "Database entry $file cannot be read!\n";
my @lines = <FILE>;
close FILE;
my $ch = 0;
for my $id (keys %idhash) {
foreach (@lines) {
if (s!(printer/|recnum=)$id($|\D)!$1$idhash{$id}$2!g) {
$ch = 1;
$changes ++;
print ".";
}
}
}
print "\n";
next if !$ch;
open FILE, "> $libdir/db/source/$file" ||
die "Database entry $file cannot be written!\n";
print FILE join('', @lines);
close FILE;
print " Wrote $file.\n";
$chfiles ++;
push(@chfilelist, "db/source/$file\n");
}
# List of files changed in CVS
$file = "changedfiles";
open FILE, "> $file" ||
die "File $file cannot be written!\n";
print FILE join('', @oldidlist, @chfilelist);
close FILE;
print " Wrote $file.\n";
print "$changes changes on $chfiles files applied.\n";
exit 0;
# member( $a, @b ) returns 1 if $a is in @b, 0 otherwise.
sub member { my $e = shift; foreach (@_) { $e eq $_ and return 1 } 0 };